import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';

// 使用 Reflector 反射读取 setMetaData 的值判断
// 案例：从 url 判断有没有admin权限
import { Reflector } from '@nestjs/core';
import type { Request } from 'express';

@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private Reflector: Reflector) {}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    // 需要和 @SetMetadata(key, array) 中的 key 相同
    const admin = this.Reflector.get<string[]>('role', context.getHandler()); // 获取 array 的值
    // 对 url 进行判断
    const request = context.switchToHttp().getRequest<Request>();
    if (admin && admin.includes(request.query.role as string)) return true;
    else return false;
  }
}
